# 2025.01.04力扣网刷题
# 卡牌分组——数学、哈希表、数组、计数、数论——简单
# 给定一副牌，每张牌上都写着一个整数。
# 此时，你需要选定一个数字 X，使我们可以将整副牌按下述规则分成 1 组或更多组：
# 每组都有 X 张牌。
# 组内所有的牌上都写着相同的整数。
# 仅当你可选的 X >= 2 时返回 true。
# 示例 1：
# 输入：deck = [1, 2, 3, 4, 4, 3, 2, 1]
# 输出：true
# 解释：可行的分组是[1, 1]，[2, 2]，[3, 3]，[4, 4]
# 示例 2：
# 输入：deck = [1, 1, 1, 2, 2, 2, 3, 3]
# 输出：false
# 解释：没有满足要求的分组。
# 提示：
# 1 <= deck.length <= 10^4
# 0 <= deck[i] < 10^4


class Solution(object):
    def hasGroupsSizeX(self, deck):
        """
        :type deck: List[int]
        :rtype: bool
        """
        length = len(deck)
        hash = dict()
        for i in range(length):
            if deck[i] not in hash:
                hash[deck[i]] = 1
            else:
                hash[deck[i]] += 1
        def common_factor(a, b):
            if b > a:
                a, b = b, a
            mi = b
            while a % mi != 0 or b % mi != 0:
                mi -= 1
            return mi
        x = hash[deck[0]]
        for value in hash.values():
            x = common_factor(x, value)
        return x >= 2